using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;

namespace Game.Terrain.Terrain
{
    public class TerrainTileMapBase
    {
        public Tilemap TerrainTilemap;
        public int TerrainWidth { get; private set; }
        public int TerrainHeight { get; private set; }

        private int Layer { get; set; } = 1;
        private HashSet<int> _emptyPositions = new HashSet<int>(); // 使用 int 值存储空位置

        public void Initialize(Tilemap tilemap, int width, int height)
        {
            TerrainTilemap = tilemap;
            TerrainTilemap.ClearAllTiles();
            TerrainWidth = width;
            TerrainHeight = height;
            RecordEmptyPositions();
        }

        private void RecordEmptyPositions()
        {
            // 遍历所有单元格
            for (int x = 0; x < TerrainWidth; x++)
            {
                for (int y = 0; y < TerrainHeight; y++)
                {
                    for (int z = 0; z < Layer; z++)
                    {
                        Vector3Int cellPosition = new Vector3Int(x, y, z);

                        // 检查该位置是否有瓦片
                        if (TerrainTilemap.GetTile(cellPosition) == null)
                        {
                            // 将位置编码为 int 值并存储
                            int encodedPosition = EncodePosition(x, y, z);
                            _emptyPositions.Add(encodedPosition);
                        }
                    }
                }
            }

            Debug.Log("Recorded " + _emptyPositions.Count + " empty positions.");
        }

        Vector3Int GetRandomEmptyPosition()
        {
            if (_emptyPositions.Count > 0)
            {
                // 从 HashSet 中随机选取一个编码的位置
                int randomIndex = Random.Range(0, _emptyPositions.Count);
                int encodedPosition = new List<int>(_emptyPositions)[randomIndex];

                // 解码为 Vector3Int
                DecodePosition(encodedPosition, out int x, out int y, out int z);
                return new Vector3Int(x, y, z);
            }

            // 如果没有空位置，返回 Vector3Int.zero
            return Vector3Int.zero;
        }

        int EncodePosition(int x, int y, int z)
        {
            return (x << 19) | (y << 6) | z;
        }

        void DecodePosition(int encoded, out int x, out int y, out int z)
        {
            x = (encoded >> 19) & 0x1FFF; // 取高 13 位
            y = (encoded >> 6) & 0x1FFF; // 取中 13 位
            z = encoded & 0x3F; // 取低 6 位
        }

        public void PlaceBuilding(TerrainEntity entity)
        {
            // 检查是否有空位置
            if (_emptyPositions.Count == 0)
            {
                Debug.LogWarning("No empty positions available.");
                return;
            }

            // 检查该位置是否有瓦片
            Vector3Int cellPosition = GetRandomEmptyPosition();
            // 移除该位置的空位置记录
            int encodedPosition = EncodePosition(cellPosition.x, cellPosition.y, cellPosition.z);
            _emptyPositions.Remove(encodedPosition);
            if (TerrainTilemap.GetTile(cellPosition) != null)
            {
                Debug.LogWarning("Position is not empty.");
                return;
            }

            // 在该位置放置建筑
            TerrainTilemap.SetTile(cellPosition, entity.BuildingTile);
        }
    }
}